from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager

from conf.config import config


class MyEdgeService(EdgeService):
    def __init__(self, *args, **kwargs):
        super(MyEdgeService, self).__init__(*args, **kwargs)
        self.creationflags = 134217728  # 解决selenium弹出黑窗口的问题。creationflags原值为0，改为134217728。134217728值的来源：from win32process import CREATE_NO_WINDOW


class EdgeDriver(object):
    def __init__(self):
        super(EdgeDriver, self).__init__()

        options = Options()

        # 无头模式，不提供可视化页面
        if config.get("headless"):
            options.add_argument("--headless=new")  # 解决edge浏览器无头模式下，实际打开的是chrome浏览器的问题 https://github.com/MicrosoftEdge/EdgeWebDriver/issues/74 ; https://developer.chrome.com/articles/new-headless/

        # 最大化运行（全屏窗口）
        options.add_argument("--start-maximized")

        # 启用代理
        if config.get("proxy_enable"):
            options.add_argument(f'--proxy-server={config.get("proxy_host")}:{config.get("proxy_port")}')

        # 忽略网站证书错误
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--ignore-ssl-errors')

        # 无痕模式
        options.add_argument('--incognito')

        # 设置开发者模式启动，该模式下webdriver属性为正常值，且不显示浏览器正在受自动程序控制
        options.add_experimental_option('excludeSwitches', ['enable-automation'])

        prefs = {'profile.managed_default_content_settings.images': 2}  # 不加载图片
        options.add_experimental_option('prefs', prefs)

        # 其他配置，比如反爬虫
        options.add_experimental_option('useAutomationExtension', False)
        options.add_argument("--disable-blink-features")
        options.add_argument("--disable-blink-features=AutomationControlled")

        self.browser = webdriver.Edge(
            options=options,
            service=MyEdgeService(EdgeChromiumDriverManager().install())
        )
